<!DOCTYPE html>
<html lang="en">
    <head>
	<meta name="generator" content="Hugo 0.75.1" />
  <meta charset="utf-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <meta name="format-detection" content="telephone=no" />

  <title>
    迪克猪的博客
  </title>

  
  <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
  <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
  <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
  <link rel="manifest" href="/manifest.json" />
  <meta name="theme-color" content="#ffffff" />

  
  <link
    rel="stylesheet"
    href="https://unpkg.com/modern-normalize@0.6.0/modern-normalize.css"
  />

  
  
  
  
  <link rel="stylesheet" href="https://zsy619.github.io/style.min.f7761d111b74dd5c07f0111decee92938c12abc42e0fd319e1a07483e248b54e.css" integrity="sha256-93YdERt03VwH8BEd7O6Sk4wSq8QuD9MZ4aB0g&#43;JItU4=" />

  
    <link rel="alternate" type="application/rss+xml" href="https://zsy619.github.io/index.xml" title="迪克猪的博客" />
  
  
    
  
</head>

    <body>
        <header id="header">
  <div class="header_container">
    <h1 class="sitetitle">
      <a href="https://zsy619.github.io" title="迪克猪的博客">迪克猪的博客</a>
    </h1>
    <nav class="navbar">
      <ul>
        <li><a href="https://zsy619.github.io">Home</a></li>
        
          <li>
            <a href="/post/">
              
              <span>LINUX性能优化</span>
            </a>
          </li>
        
          <li>
            <a href="/csapp/">
              
              <span>深入理解计算机系统_第三版</span>
            </a>
          </li>
        
          <li>
            <a href="/golang/">
              
              <span>golang</span>
            </a>
          </li>
        
          <li>
            <a href="/docker/">
              
              <span>容器</span>
            </a>
          </li>
        
          <li>
            <a href="/flutter/">
              
              <span>Flutter</span>
            </a>
          </li>
        
          <li>
            <a href="/know/">
              
              <span>知识点</span>
            </a>
          </li>
        
          <li>
            <a href="/categories/">
              
              <span>目录</span>
            </a>
          </li>
        
          <li>
            <a href="/about/">
              
              <span>关于</span>
            </a>
          </li>
        
        <li class="hide-sm"><a href="https://zsy619.github.io/index.xml" type="application/rss+xml">RSS</a></li>
      </ul>
    </nav>
  </div>
</header>

        
<section id="main" class="index">
  <div class="post_list container">
    
    
    <article class="post content">
      <time datetime="2020-07-16T14:25:58&#43;0800" class="date">Thu, Jul 16, 2020</time>
      <h3 class="title">
        <a href="https://zsy619.github.io/post/54%E5%A5%97%E8%B7%AF%E7%AF%87%E5%BA%94%E7%94%A8%E7%9B%91%E6%8E%A7%E7%9A%84%E4%B8%80%E8%88%AC%E6%80%9D%E8%B7%AF/" title="54|套路篇：应用监控的一般思路">54|套路篇：应用监控的一般思路</a>
      </h3>
      <div class="post_content summary">
        指标监控 应用程序的核心指标，不再是资源的使用情况，而是请求数、错误率和响应时间。
第一个，是应用进程的资源使用情况，比如进程占用的 CPU、内存、磁盘 I/O、网络等。使用过多的系统资源，导致应用程序响应缓慢或者错误数升高，是一个最常见的性能问题。
第二个，是应用程序之间调用情况，比如调用频率、错误数、延时等。由于应用程序并不是孤立的，如果其依赖的其他应用出现了性能问题，应用自身性能也会受到影响。
第三个，是应用程序内部核心逻辑的运行情况，比如关键环节的耗时以及执行过程中的错误等。由于这是应用程序内部的状态，从外部通常无法直接获取到详细的性能数据。所以，应用程序在设计和开发时，就应该把这些指标提供出来，以便监控系统可以了解其内部运行状态。
 有了应用程序之间的调用指标，你可以迅速分析出一个请求处理的调用链中，到底哪个组件才是导致性能问题的罪魁祸首； 而有了应用程序内部核心逻辑的运行性能，你就可以更进一步，直接进入应用程序的内部，定位到底是哪个处理环节的函数导致了性能问题。  基于这些思路，我相信你就可以构建出，描述应用程序运行状态的性能指标。再将这些指标纳入我们上一期提到的监控系统（比如 Prometheus + Grafana）中，就可以跟系统监控一样，一方面通过告警系统，把问题及时汇报给相关团队处理；另一方面，通过直观的图形界面，动态展示应用程序的整体性能。
        
          <span class="hellip">&hellip;</span>
        
      </div>
    </article>
    
    <article class="post content">
      <time datetime="2020-07-16T14:12:53&#43;0800" class="date">Thu, Jul 16, 2020</time>
      <h3 class="title">
        <a href="https://zsy619.github.io/post/53%E5%A5%97%E8%B7%AF%E7%AF%87%E7%B3%BB%E7%BB%9F%E7%9B%91%E6%8E%A7%E7%9A%84%E7%BB%BC%E5%90%88%E6%80%9D%E8%B7%AF/" title="53|套路篇：系统监控的综合思路">53|套路篇：系统监控的综合思路</a>
      </h3>
      <div class="post_content summary">
        要做好监控，最核心的就是全面的、可量化的指标，这包括系统和应用两个方面。
USE 法 为你介绍一种专门用于性能监控的 USE（Utilization Saturation and Errors）法。USE 法把系统资源的性能指标，简化成了三个类别，即使用率、饱和度以及错误数。
 使用率，表示资源用于服务的时间或容量百分比。100% 的使用率，表示容量已经用尽或者全部时间都用于服务。 饱和度，表示资源的繁忙程度，通常与等待队列的长度相关。100% 的饱和度，表示资源无法接受更多的请求。错误数表示发生错误的事件个数。 错误数越多，表明系统的问题越严重。  这三个类别的指标，涵盖了系统资源的常见性能瓶颈，所以常被用来快速定位系统资源的性能瓶颈。这样，无论是对 CPU、内存、磁盘和文件系统、网络等硬件资源，还是对文件描述符数、连接数、连接跟踪数等软件资源，USE 方法都可以帮你快速定位出，是哪一种系统资源出现了性能瓶颈。
        
          <span class="hellip">&hellip;</span>
        
      </div>
    </article>
    
    <article class="post content">
      <time datetime="2020-07-14T18:12:19&#43;0800" class="date">Tue, Jul 14, 2020</time>
      <h3 class="title">
        <a href="https://zsy619.github.io/post/52%E6%A1%88%E4%BE%8B%E7%AF%87%E6%9C%8D%E5%8A%A1%E5%90%9E%E5%90%90%E9%87%8F%E4%B8%8B%E9%99%8D%E5%BE%88%E5%8E%89%E5%AE%B3%E6%80%8E%E4%B9%88%E5%88%86%E6%9E%90/" title="52|案例篇：服务吞吐量下降很厉害，怎么分析？">52|案例篇：服务吞吐量下降很厉害，怎么分析？</a>
      </h3>
      <div class="post_content summary">
        使用 perf 配合火焰图寻找热点函数，是一个比较通用的性能定位方法，在很多场景中都可以使用。 如果这仍满足不了你的要求，那么在新版的内核中，eBPF 和 BCC 是最灵活的动态追踪方法。 而在旧版本内核，特别是在 RHEL 系统中，由于 eBPF 支持受限，SystemTap 和 ftrace 往往是更好的选择。  连接数优化 要查看 TCP 连接数的汇总情况，首选工具自然是 ss 命令。
        
          <span class="hellip">&hellip;</span>
        
      </div>
    </article>
    
    <article class="post content">
      <time datetime="2020-07-14T17:52:46&#43;0800" class="date">Tue, Jul 14, 2020</time>
      <h3 class="title">
        <a href="https://zsy619.github.io/post/51%E6%A1%88%E4%BE%8B%E7%AF%87%E5%8A%A8%E6%80%81%E8%BF%BD%E8%B8%AA%E6%80%8E%E4%B9%88%E7%94%A8%E4%B8%8B/" title="51|案例篇：动态追踪怎么用？（下）">51|案例篇：动态追踪怎么用？（下）</a>
      </h3>
      <div class="post_content summary">
        在 Linux 系统中，常见的动态追踪方法包括 ftrace、perf、eBPF 以及 SystemTap 等。上节课，我们具体学习了 ftrace 的使用方法。
perf 我们前面使用 perf record/top 时，都是先对事件进行采样，然后再根据采样数，评估各个函数的调用频率。实际上，perf 的功能远不止于此。比如，
        
          <span class="hellip">&hellip;</span>
        
      </div>
    </article>
    
    <article class="post content">
      <time datetime="2020-07-13T08:35:13&#43;0800" class="date">Mon, Jul 13, 2020</time>
      <h3 class="title">
        <a href="https://zsy619.github.io/post/50%E6%A1%88%E4%BE%8B%E7%AF%87%E5%8A%A8%E6%80%81%E8%BF%BD%E8%B8%AA%E6%80%8E%E4%B9%88%E7%94%A8%E4%B8%8A/" title="50|案例篇：动态追踪怎么用？（上）">50|案例篇：动态追踪怎么用？（上）</a>
      </h3>
      <div class="post_content summary">
        动态追踪技术，通过探针机制，来采集内核或者应用程序的运行信息，从而可以不用修改内核和应用程序的代码，就获得丰富的信息，帮你分析、定位想要排查的问题。以往，在排查和调试性能问题时，我们往往需要先为应用程序设置一系列的断点（比如使用 GDB），然后以手动或者脚本（比如 GDB 的 Python 扩展）的方式，在这些断点处分析应用程序的状态。或者，增加一系列的日志，从日志中寻找线索。
相比以往的进程级跟踪方法（比如 ptrace），动态追踪往往只会带来很小的性能损耗（通常在 5% 或者更少）。
        
          <span class="hellip">&hellip;</span>
        
      </div>
    </article>
    
    <article class="post content">
      <time datetime="2020-07-09T16:05:27&#43;0800" class="date">Thu, Jul 9, 2020</time>
      <h3 class="title">
        <a href="https://zsy619.github.io/post/49%E6%A1%88%E4%BE%8B%E7%AF%87%E5%86%85%E6%A0%B8%E7%BA%BF%E7%A8%8B-cpu-%E5%88%A9%E7%94%A8%E7%8E%87%E5%A4%AA%E9%AB%98%E6%88%91%E8%AF%A5%E6%80%8E%E4%B9%88%E5%8A%9E/" title="49|案例篇：内核线程 CPU 利用率太高，我该怎么办？">49|案例篇：内核线程 CPU 利用率太高，我该怎么办？</a>
      </h3>
      <div class="post_content summary">
        内核线程 在 Linux 中，用户态进程的“祖先”，都是 PID 号为 1 的 init 进程。比如，现在主流的 Linux 发行版中，init 都是 systemd 进程；而其他的用户态进程，会通过 systemd 来进行管理。
        
          <span class="hellip">&hellip;</span>
        
      </div>
    </article>
    
    <article class="post content">
      <time datetime="2020-07-09T15:51:03&#43;0800" class="date">Thu, Jul 9, 2020</time>
      <h3 class="title">
        <a href="https://zsy619.github.io/post/48%E6%A1%88%E4%BE%8B%E7%AF%87%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%80%BB%E6%98%AF%E6%97%B6%E4%B8%8D%E6%97%B6%E4%B8%A2%E5%8C%85%E6%88%91%E8%AF%A5%E6%80%8E%E4%B9%88%E5%8A%9E%E4%B8%8B/" title="48|案例篇：服务器总是时不时丢包，我该怎么办？（下）">48|案例篇：服务器总是时不时丢包，我该怎么办？（下）</a>
      </h3>
      <div class="post_content summary">
        iptables 更简单的方法，就是直接查询 DROP 和 REJECT 等规则的统计信息，看看是否为 0。如果统计值不是 0 ，再把相关的规则拎出来进行分析。
可以通过 iptables -nvL 命令，查看各条规则的统计信息。比如，你可以执行下面的 docker exec 命令，进入容器终端；然后再执行下面的 iptables 命令，就可以看到 filter 表的统计数据了：
        
          <span class="hellip">&hellip;</span>
        
      </div>
    </article>
    
    <article class="post content">
      <time datetime="2020-07-09T15:34:15&#43;0800" class="date">Thu, Jul 9, 2020</time>
      <h3 class="title">
        <a href="https://zsy619.github.io/post/47%E6%A1%88%E4%BE%8B%E7%AF%87%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%80%BB%E6%98%AF%E6%97%B6%E4%B8%8D%E6%97%B6%E4%B8%A2%E5%8C%85%E6%88%91%E8%AF%A5%E6%80%8E%E4%B9%88%E5%8A%9E%E4%B8%8A/" title="47|案例篇：服务器总是时不时丢包，我该怎么办？（上）">47|案例篇：服务器总是时不时丢包，我该怎么办？（上）</a>
      </h3>
      <div class="post_content summary">
        执行 docker ps 命令，查询容器的状态：
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dae0202cc27e feisky/nginx:drop &#34;/start.
        
          <span class="hellip">&hellip;</span>
        
      </div>
    </article>
    
    <article class="post content">
      <time datetime="2020-07-09T15:18:53&#43;0800" class="date">Thu, Jul 9, 2020</time>
      <h3 class="title">
        <a href="https://zsy619.github.io/post/46%E6%A1%88%E4%BE%8B%E7%AF%87%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BA%94%E7%94%A8%E5%AE%B9%E5%99%A8%E5%8C%96%E5%90%8E%E5%90%AF%E5%8A%A8%E6%85%A2%E4%BA%86%E5%BE%88%E5%A4%9A/" title="46|案例篇：为什么应用容器化后，启动慢了很多？">46|案例篇：为什么应用容器化后，启动慢了很多？</a>
      </h3>
      <div class="post_content summary">
        随着 Kubernetes、Docker 等技术的普及，越来越多的企业，都已经走上了应用程序容器化的道路。我相信，你在了解学习这些技术的同时，一定也听说过不少，基于 Docker 的微服务架构带来的各种优势，比如：
 使用 Docker ，把应用程序以及相关依赖打包到镜像中后，部署和升级更快捷； 把传统的单体应用拆分成多个更小的微服务应用后，每个微服务的功能都更简单，并且可以单独管理和维护； 每个微服务都可以根据需求横向扩展。即使发生故障，也只是局部服务不可用，而不像以前那样，导致整个服务不可用。  案例 docker 启动 Tomat 应用：
        
          <span class="hellip">&hellip;</span>
        
      </div>
    </article>
    
    <article class="post content">
      <time datetime="2020-07-07T17:09:43&#43;0800" class="date">Tue, Jul 7, 2020</time>
      <h3 class="title">
        <a href="https://zsy619.github.io/post/45%E7%AD%94%E7%96%91%E4%BA%94%E7%BD%91%E7%BB%9C%E6%94%B6%E5%8F%91%E8%BF%87%E7%A8%8B%E4%B8%AD%E7%BC%93%E5%86%B2%E5%8C%BA%E4%BD%8D%E7%BD%AE%E5%9C%A8%E5%93%AA%E9%87%8C/" title="45|答疑（五）：网络收发过程中，缓冲区位置在哪里？">45|答疑（五）：网络收发过程中，缓冲区位置在哪里？</a>
      </h3>
      <div class="post_content summary">
        问题 1：网络收发过程中缓冲区的位置 第一点，是网络收发过程中，收发队列和缓冲区位置的疑问。
 网卡收发网络包时，通过 DMA 方式交互的环形缓冲区； 网卡中断处理程序为网络帧分配的，内核数据结构 sk_buff 缓冲区； 应用程序通过套接字接口，与网络协议栈交互时的套接字缓冲区。  其中，环形缓冲区，由于需要 DMA 与网卡交互，理应属于网卡设备驱动的范围。
        
          <span class="hellip">&hellip;</span>
        
      </div>
    </article>
    
    


<div class="pagination">
  <ul class="pagination_container">
      
        
          <li class="page-item prev to-left">
            <a href="/page/3/" aria-label="Previous" class="page-link">
              <span aria-hidden="true">❮ Prev</span>
            </a>
          </li>
        
        
          <li class="page-item next to-right">
            <a href="/page/5/" aria-label="Next" class="page-link">
              <span aria-hidden="true">Next ❯</span>
            </a>
          </li>
        
      
  </ul>
</div>


  </div>
</section>

        <a id="back_to_top" title="Go To Top" href="#">
  <span>
    <svg viewBox="0 0 24 24">
      <path fill="none" d="M0 0h24v24H0z"></path>
      <path d="M12 2L4.5 20.29l.71.71L12 18l6.79 3 .71-.71z"></path>
    </svg>
  </span>
</a>

        <footer id="footer">
  <p>
    <span>&copy; 2021 <a href="https://zsy619.github.io" title="迪克猪的博客">迪克猪的博客</a> </span>
    <span>Built with <a rel="nofollow" target="_blank" href="https://gohugo.io">Hugo</a></span>
    <span>Theme by <a rel="nofollow" target="_blank" href="https://github.com/wayjam/hugo-theme-mixedpaper">WayJam</a></span>
  </p>

  <script src="https://zsy619.github.io/js/main.min.8b182175f5874aeed0acc0979345c98d4bde22208ec4f36cc1d6e3102acb4b10.js" integrity="sha256-ixghdfWHSu7QrMCXk0XJjUveIiCOxPNswdbjECrLSxA=" crossorigin="anonymous" async></script>
</footer>

    </body>
</html>
